python design principles